package server;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.util.Hashtable;

/**
 * classe responsavel por guadar os identificadoes das sockets dos utilizadores
 * Usa a classe SocketsJogador que vai conter os identificadores de 1 cliente
 * Insere tudo numa hashtable
 */

public class UsersHandlers{
	private Hashtable handlers;

	UsersHandlers(){
		this.handlers = new Hashtable();
	}
	
	/*
     *Insere/actualiza utilizador e o seu identificador de socket TCP na hashtable
     *
     */
	synchronized public void insereIdentClientSoketTCP(String nome , ObjectOutputStream oos){
        if (this.handlers.containsKey(nome)){  //se o utilizado esta inserido ja
        	UserHandler aux =(UserHandler)  this.handlers.get(nome);
			aux.setOututStream (oos);
			this.handlers.put(nome, aux);                      //actualiza o identificador  
		}else {  //nao existe o jogador na hashtable
			UserHandler aux = new  UserHandler(oos, null,0);
	        this.handlers.put(nome, aux);                      //actualiza o identificador  	
        }
	}

	/*
     *Insere/actualiza utilizador e o seu identificador de socket UDP na hashtable
     *
     */
	synchronized public void  insereIdentClientSoketUDP(String nome,InetAddress inet,int remotePort){
		  if (this.handlers.containsKey(nome)){  //se o utilizado esta inserido ja
			  	UserHandler aux =(UserHandler)this.handlers.get(nome);
				aux.setInetAdress(inet);
				aux.setUdpPortT(remotePort);
				this.handlers.put(nome, aux);                      //actualiza o identificador  
		  }else {  //nao existe o jogador na hashtable
			  	UserHandler aux = new  UserHandler(null , inet, remotePort);
		        this.handlers.put(nome, aux);                      //actualiza o identificador  	
	      }
	}
	
	
	/*
	 * devolve se o cliente tem handler ou nao
	 */
	public boolean existeCliente(String nome){
		UserHandler aux= (UserHandler) handlers.get(nome);
		if(aux==null){
			return true;
		}
		return false;
		
    }
	
	
	
	/*
	 * Procura na hashtable o cliente e devolve o identificado corespondente
	 */
	public ObjectOutputStream getSocketTCP(String nome){
		//System.out.println("vou obter handler do nome ="+ nome);
		UserHandler aux= (UserHandler) handlers.get(nome);
		return aux.getOutputStream();
    }
	
	/*
	 * Procura na hashtable o cliente e devolve o identificado corespondente
	 */
	public InetAddress getSocketUDP(String nome){
		UserHandler aux= (UserHandler) handlers.get(nome);
		return aux.getInetAddress();
	}

	/*
	 * manda a porta remota de UDP
	 */
	public int getSocketUdpPort(String nome){
		UserHandler aux= (UserHandler) handlers.get(nome);
		return aux.getUdpPortT();
    }
}

